/*
 * @(#)ImpliedMemFunc.java        1.0 2000/05/09
 *
 * This file is part of Xfuzzy 3.0, a design environment for fuzzy logic
 * based systems.
 *
 * (c) 2000 IMSE-CNM. The authors may be contacted by the email address:
 *                    xfuzzy-team@imse.cnm.es
 *
 * Xfuzzy is free software; you can redistribute it and/or modify it
 * under the terms of the GNU General Public License as published by
 * the Free Software Foundation.
 *
 * Xfuzzy is distributed in the hope that it will be useful, but WITHOUT
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
 * for more details.
 */

package xfuzzy.lang;

/**
 * Clase que describe una funci�n de pertenencia implicada
 * 
 * @author Francisco Jos� Moreno Velo
 *
 */

public class ImpliedMemFunc implements MemFunc {
	
	//----------------------------------------------------------------------------//
	//                             MIEMBROS PRIVADOS                              //
	//----------------------------------------------------------------------------//
	
	/**
	 * Base de reglas que produce la implicaci�n
	 */
	private KnowledgeBase mod;
	
	/**
	 * Etiqueta ling��stica implicada
	 */
	private LinguisticLabel mf;
	
	/**
	 * Grado de activaci�n de la regla
	 */
	private double degree;
	
	/**
	 * Derivada de la salida respecto al grado de activaci�n de la regla
	 * siguiendo esta implicaci�n
	 */
	private double derivative;
	
	//----------------------------------------------------------------------------//
	//                               CONSTRUCTOR                                  //
	//----------------------------------------------------------------------------//
	
	/**
	 * Constructor
	 */
	public ImpliedMemFunc(LinguisticLabel mf, KnowledgeBase mod, double degree) {
		this.mf = mf;
		this.mod = mod;
		this.degree = degree;
		this.derivative = 0;
	}
	
	//----------------------------------------------------------------------------//
	//                            M�TODOS P�BLICOS                                //
	//----------------------------------------------------------------------------//
	
	/**
	 * Calcula el grado de pertenencia a la funci�n
	 */
	public double compute(double x) {
		return this.mod.operation.imp.compute(this.degree, this.mf.compute(x));
	}
	
	/**
	 * Obtiene el grado de activaci�n de la funci�n implicada
	 */
	public double degree() {
		return this.degree;
	}
	
	/**
	 * Obtiene el valor del par�metro i-esimo de la funci�n
	 */
	public double param(int i) {
		return (this.mf.get())[i];
	}
	
	/**
	 * Obtiene el valor del centro de la funci�n implicada
	 */
	public double center() {
		return mf.center();
	}
	
	/**
	 * Obtiene el valor de la base de la funci�n implicada
	 */
	public double basis() {
		return mf.basis();
	}
	
	/**
	 * Asigna el valor de la derivada del grado de activaci�n
	 */
	public void setDegreeDeriv(double deriv) {
		this.derivative += deriv;
	}
	
	/**
	 * Asigna el valor de la derivada del par�metro i-esimo
	 */
	public void setParamDeriv(int index, double deriv) {
		this.mf.addDeriv(index,deriv);
	}
	
	/**
	 * Asigna el valor de la derivada del centro de la funci�n
	 */
	public void setCenterDeriv(double deriv) {
		try { 
			double paramdev[] = mf.deriv_center();
			for(int i=0; i<paramdev.length; i++) mf.addDeriv(i,paramdev[i]*deriv);
		}
		catch(XflException ex) {}
	}
	
	/**
	 * Asigna el valor de la derivada de la base de la funci�n
	 */
	public void setBasisDeriv(double deriv) {
		try { 
			double paramdev[] = mf.deriv_basis();
			for(int i=0; i<paramdev.length; i++) mf.addDeriv(i,paramdev[i]*deriv);
		}
		catch(XflException ex) {}
	}
	
	/**
	 * Obtiene el valor de los par�metros de la funci�n
	 */
	public double[] getParam() {
		return this.mf.get();
	}
	
	/**
	 * Obtiene el valor del grado de activaci�n de la funci�n
	 */
	public double getDegree() {
		return this.degree;
	}
	
	/**
	 * Obtiene la derivada del grado de activaci�n de la funci�n
	 */
	public double getDegreeDeriv() {
		return this.derivative;
	}
	
	/**
	 * Obtiene la referencia de la funci�n de pertenencia
	 */
	public LinguisticLabel getMF() {
		return this.mf;
	}
	
	/**
	 * Asigna el valor del grado de activaci�n de la funci�n
	 */
	public void setDegree(double degree) {
		this.degree = degree;
	}
	
	/**
	 * Asigna el valor de la derivada del grado de activaci�n
	 */
	public void setDerivative(double deriv) {
		this.derivative = deriv;
	}
}
